﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using log4net;
using SegIdenPC.Herramientas;
using GS1.Utilitario;

namespace SegIdenPC.Formularios
{
    public partial class frmMantProveedor : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantProveedor));

        private const string TITULO = "Mantenimiento de Proveedores";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total proveedores encontrados: {0}";

        private const string IDENTIFICACION = "Identificación";
        private const string RAZONSOCIAL = "Razón Social";
        private string ESTADO = string.Empty;

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Cancelar = 4,
            Eliminar = 5
        }

        public Proveedor proveedorActual = null;

        public bool formularioBusqueda { get; set; }

        private ListaPais paises = null;

        private ListaDistrito listaDistritos = null;

        #endregion

        #region --- Constructor ---
        public frmMantProveedor()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantProveedor_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void frmMantProveedor_FormClosing(object sender, FormClosingEventArgs e)
        {
            finalizarFormulario();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }

        private void tbtnRetorno_Click(object sender, EventArgs e)
        {
            retorno();
        }

        private void tbtnEliminar_Click(object sender, EventArgs e)
        {
            eliminar();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscar();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarContacto();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarContacto();
        }

        private void dgvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarProveedor();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { buscar(); }
        }

        private void dgvListadoContactos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarContactoProveedor();
        }


        private void dgvListadoContactos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarContactoProveedor();
        }

        private void cboPaisProveedor_SelectedIndexChanged(object sender, EventArgs e)
        {
            seleccionarNacionalExtranjero();
        }

        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaTipoProveedor = null;
            ListaGeneral listaEstado = null;
            ListaPais listaPais = null;
            ListaDistrito listaDistrito = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de documentos
                listaTipoProveedor = new ListaGeneral();
                listaTipoProveedor.Add(new General { codigo = Constantes.CODIGO_TIPO_PROVEEDOR_NACIONAL, descripcion = Constantes.DESCRIPCION_TIPO_PROVEEDOR_NACIONAL });
                listaTipoProveedor.Add(new General { codigo = Constantes.CODIGO_TIPO_PROVEEDOR_EXTRANJERO, descripcion = Constantes.DESCRIPCION_TIPO_PROVEEDOR_EXTRANJERO });

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_ACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_ACTIVO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_INACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_INACTIVO});

                //Instanciando y creando listado de país
                listaPais = new ListaPais();

                //Instanciando y creando listado de Distritos
                listaDistrito = new ListaDistrito();

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;

                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo parametros del Combo Criterio
                this.cboCriterio.Items.Add(IDENTIFICACION);
                this.cboCriterio.Items.Add(RAZONSOCIAL);
                this.cboCriterio.SelectedIndex = 0;

                // Estableciendo parametros del combo Tipo proveedor
                this.cboTipoProveedor.DataSource = listaTipoProveedor;
                this.cboTipoProveedor.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoProveedor.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoProveedor.SelectedIndex = 0;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                cargarPaises();

                cargarDistritos();

                // Estableciendo focus
                this.txtCriterio.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }

        private void cargarPaises()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PAIS;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaPais (Paises)
            this.paises = contenidoXML.DeserializarTo<ListaPais>();

            // Estableciendo listado de paises
            this.cboPaisProveedor.DataSource = this.paises.lista;
            this.cboPaisProveedor.ValueMember = "codPais";
            this.cboPaisProveedor.DisplayMember = "desPais";
            this.cboPaisProveedor.SelectedIndex = 0;

           }

        private void cargarDistritos()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_DISTRITOS;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaPais (Paises)
            this.listaDistritos = contenidoXML.DeserializarTo<ListaDistrito>();

            // Estableciendo listado de paises
            this.cboDistrito.DataSource = this.listaDistritos.lista;
            this.cboDistrito.ValueMember = "codigo";
            this.cboDistrito.DisplayMember = "descripcion";
            this.cboDistrito.SelectedIndex = 27;

        }

        private void seleccionarNacionalExtranjero()
        {
            int codigoNacionalExtranjero = 0;

            if (this.cboPaisProveedor.SelectedValue is int)
            {
                codigoNacionalExtranjero = Int32.Parse(this.cboPaisProveedor.SelectedValue.ToString());
            }
            else
            {
                codigoNacionalExtranjero = ((Pais)this.cboPaisProveedor.SelectedValue).codPais;
            }

            if (codigoNacionalExtranjero.Equals(175))
            {
                this.cboTipoProveedor.Text = Constantes.DESCRIPCION_TIPO_PROVEEDOR_NACIONAL;
            }
            else
            {
                this.cboTipoProveedor.Text = Constantes.DESCRIPCION_TIPO_PROVEEDOR_EXTRANJERO;
            }

        }

        private void pintarGrilla()
        {
            ListPersonalizada<Proveedor> listaProveedores = null;
            listaProveedores = (ListPersonalizada<Proveedor>)this.dgvListado.DataSource;

            if (listaProveedores != null)
            {
                for (int i = 0; i < listaProveedores.Count; i++)
                {
                    var proveedor = listaProveedores[i];

                    proveedor.tipo = proveedor.tipo.Equals(Constantes.CODIGO_TIPO_PROVEEDOR_NACIONAL) ? Constantes.DESCRIPCION_TIPO_PROVEEDOR_NACIONAL : 
                                                                                                        Constantes.DESCRIPCION_TIPO_PROVEEDOR_EXTRANJERO;

                    proveedor.estado = proveedor.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO) ? Constantes.ESTADO_DESCRIPCION_INACTIVO : 
                                                                                                    Constantes.ESTADO_DESCRIPCION_ACTIVO;

                    if (proveedor.estado.Equals(Constantes.ESTADO_DESCRIPCION_INACTIVO))
                    {
                        this.dgvListado.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                    }
                }
            }
        }

        private bool validarEntradaBusqueda()
        {
            this.txtCriterio.Text = this.txtCriterio.Text.Trim();
            if (this.txtCriterio.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar el valor de busqueda");
                return true;
            }

            if (this.txtCriterio.TextLength < 3)
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar por lo menos 3 caracteres para realizar la busqueda");
                return true;
            }

            return false;
        }

        private void listarProveedores(string criterio, string valor)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PROVEEDORES;

            operacion.proveedor = new Proveedor();
            operacion.proveedor.identificacion = string.Empty;
            operacion.proveedor.razonSocial = string.Empty;
            operacion.proveedor.estado = this.ESTADO;

            switch (criterio)
            {
                case IDENTIFICACION:
                    operacion.proveedor.identificacion = valor;
                    break;
                case RAZONSOCIAL:
                    operacion.proveedor.razonSocial = valor;
                    break;
            }

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaProveedor
            ListaProveedor listaProveedor = contenidoXML.DeserializarTo<ListaProveedor>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaProveedor.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListado.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListado.DataSource = listaProveedor.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaProveedor.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla();
        }

        private void buscar()
        {
            try
            {
                if (validarEntradaBusqueda()) { return; }

                // Listar proveedores con el criterio y el valor ingresado
                listarProveedores(this.cboCriterio.Text, this.txtCriterio.Text);

                // Estableciendo focus al caja de texto de busqueda
                this.txtCriterio.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void nuevo()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            // Limpiar los datos del formulario
            limpiarTodo();

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus al combo tipo proveedor
            //this.cboTipoProveedor.Focus();
            this.cboPaisProveedor.Focus();
        }

        private void editar()
        {
            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus al combo tipo proveedor
            //this.cboTipoProveedor.Focus();
            this.cboPaisProveedor.Focus();
        }

        private void abrir()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun proveedor
            if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
            {
                ListPersonalizada<Proveedor> listaProveedor = (ListPersonalizada<Proveedor>)this.dgvListado.DataSource;
                this.proveedorActual = listaProveedor[this.dgvListado.CurrentRow.Index];

                this.cboTipoProveedor.Text = this.proveedorActual.tipo;
                this.cboPaisProveedor.Text = this.proveedorActual.pais.desPais;
                this.txtIdentificacion.Text = this.proveedorActual.identificacion;
                this.txtRazonSocial.Text = this.proveedorActual.razonSocial;
                this.txtObservacion.Text = this.proveedorActual.observacion;
                this.txtDireccion.Text = this.proveedorActual.direccion;
                this.cboEstado.Text = this.proveedorActual.estado;
                this.cboDistrito.Text = this.proveedorActual.distrito.descripcion;

                limpiarContacto();

                // Cargar contactos del proveedor
                abrir_contactos(this.proveedorActual.codProveedor);
            }
        }

        private void abrir_contactos(string codigoProveedor)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_PROVEEDOR;
            operacion.proveedor = new Proveedor { codProveedor = codigoProveedor };

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de Proveedor
            Proveedor proveedor = contenidoXML.DeserializarTo<Proveedor>();

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoContactos.AutoGenerateColumns = false;

            this.dgvListadoContactos.DataSource = proveedor.listaContactoProveedor.lista == null ?
                                                    new ListPersonalizada<ContactoProveedor>() :
                                                    proveedor.listaContactoProveedor.lista;
        }

        private void cancelar()
        {
            if ( (this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.cboCriterio.Text = IDENTIFICACION;
                this.txtCriterio.Text = this.txtIdentificacion.Text;
            }

            if (!this.txtCriterio.Text.Equals(string.Empty))
            {
                // Refrescar grilla
                listarProveedores(this.cboCriterio.Text, this.txtCriterio.Text);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus al caja de texto de busqueda
            this.txtCriterio.Focus();
        }

        private void retorno()
        {
            //Revisar
            
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.cboCriterio.Text = IDENTIFICACION;
                this.txtCriterio.Text = this.txtIdentificacion.Text;
            }

            if (!this.txtCriterio.Text.Equals(string.Empty))
            {
                // Refrescar grilla
                listarProveedores(this.cboCriterio.Text, this.txtCriterio.Text);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus al caja de texto de busqueda
            this.txtCriterio.Focus();
        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Solicitar confirmacion
                if (!Libreria.ShowMessageboxPregunta((this.tipoOperacion == OperacionMantenimiento.Nuevo ?
                                                                            "¿Estas seguro de registrar el proveedor?" :
                                                                            "¿Estas seguro de modificar el proveedor actual?"), TITULO)) { return; }


                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.OPERACION_REGISTRAR_PROVEEDOR : Constantes.OPERACION_MODIFICAR_PROVEEDOR;

                operacion.proveedor = new Proveedor();
                operacion.proveedor.pais = new Pais();
                operacion.proveedor.distrito = new Distrito();

                operacion.proveedor.codProveedor = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.VALOR_CERO : this.proveedorActual.codProveedor;
                operacion.proveedor.tipo = this.cboTipoProveedor.SelectedValue.ToString();
                operacion.proveedor.identificacion = this.txtIdentificacion.Text;
                operacion.proveedor.razonSocial = this.txtRazonSocial.Text;
                operacion.proveedor.observacion = this.txtObservacion.Text;
                operacion.proveedor.direccion = this.txtDireccion.Text;
                
                operacion.proveedor.estado = this.cboEstado.SelectedValue.ToString();
                operacion.proveedor.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                operacion.proveedor.pais.codPais = Int32.Parse(this.cboPaisProveedor.SelectedValue.ToString());

                foreach (Distrito distrito in this.listaDistritos.lista)
                {
                    if (distrito.codigo.ToString().Equals(this.cboDistrito.SelectedValue.ToString()) &&
                        distrito.descripcion.Equals(this.cboDistrito.Text))
                    {
                        operacion.proveedor.distrito = distrito;
                    }
                }

                operacion.proveedor.listaContactoProveedor = new ListaContactoProveedor();
                operacion.proveedor.listaContactoProveedor.lista = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                string mensajeOK = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "Registro guardado correctamente" : "Datos modificado correctamente";
                string mensajeError = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "No se guardo los datos" : "No se actualizo los datos";


                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo(mensajeOK, TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError(mensajeError, TITULO);
                    return;
                }

                this.grpDatos.Enabled = false;

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Grabar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void eliminar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Solicitar confirmacion para eliminar el cliente
                if (!Libreria.ShowMessageboxPregunta("¿Esta seguro de eliminar a este Proveedor?", TITULO)) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_ELIMINAR_PROVEEDOR;

                operacion.proveedor = new Proveedor { codProveedor = this.proveedorActual.codProveedor };

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo("Registro eliminado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se elimino el Registro", TITULO);
                    return;
                }

                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                this.grpDatos.Enabled = false;

                listarProveedores(string.Empty, string.Empty);

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Eliminar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarEntrada()
        {
            bool resultado = false;

            this.txtIdentificacion.Text = this.txtIdentificacion.Text.Trim();
            this.txtRazonSocial.Text = this.txtRazonSocial.Text.Trim();
            
            
            if (this.txtRazonSocial.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtRazonSocial, "Debe ingresar el campo Razón Social", TITULO);
                return true;
            }

           

            return resultado;
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;

                    this.tbtnAbrir.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;

                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;

                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;

                    this.tbtnGrabar.Enabled = false;
                    
                    break;
                case Opcion.Cancelar:
                    //this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
                case Opcion.Eliminar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
            }
        }

        private void limpiarTodo()
        {
            this.txtIdentificacion.Text = string.Empty;
            this.txtRazonSocial.Text = string.Empty;
            this.txtObservacion.Text = string.Empty;
            this.txtDireccion.Text = string.Empty;
            
            this.cboEstado.Text = Constantes.ESTADO_DESCRIPCION_ACTIVO;
            this.cboDistrito.SelectedIndex = 27;

            limpiarContacto();

            ListPersonalizada<ContactoProveedor> listaContactoProveedor = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;

            if (listaContactoProveedor != null)
            {
                listaContactoProveedor.Clear();

                this.dgvListadoContactos.DataSource = null;
                this.dgvListadoContactos.DataSource = listaContactoProveedor;
            }
        }

        private void limpiarContacto()
        {
            this.txtContactoNombresyApellidos.Text = string.Empty;
            this.txtContactoEmail.Text = string.Empty;
            this.txtContactoTelefono.Text = string.Empty;
            this.txtContactoCargo.Text = string.Empty;
            this.txtContactoAnexo.Text = string.Empty;
        }

        private bool validarEntradaContacto()
        {
            bool resultado = false;

            this.txtContactoNombresyApellidos.Text = this.txtContactoNombresyApellidos.Text.Trim();
            this.txtContactoEmail.Text = this.txtContactoEmail.Text.Trim();
            this.txtContactoTelefono.Text = this.txtContactoTelefono.Text.Trim();
            this.txtContactoCargo.Text = this.txtContactoCargo.Text.Trim();

            if (this.txtContactoNombresyApellidos.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtContactoNombresyApellidos, "Debe ingresar el campo Nombres y apellidos del contacto", TITULO);
                return true;
            }

            //if (this.txtContactoEmail.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtContactoEmail, "Debe ingresar el campo Email del contacto", TITULO);
            //    return true;
            //}

            //if (this.txtContactoTelefono.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtContactoTelefono, "Debe ingresar el campo Teléfono del contacto", TITULO);
            //    return true;
            //}

            //if (this.txtContactoCargo.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtContactoCargo, "Debe ingresar el campo Cargo del contacto", TITULO);
            //    return true;
            //}

            return resultado;
        }

        private void agregarContacto()
        {
            try
            {
                if (validarEntradaContacto()) { return; }

                
                // Obteniendo lista de contactos
                ListPersonalizada<ContactoProveedor> listaContactoProveedor = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;
                if (listaContactoProveedor == null) { listaContactoProveedor = new ListPersonalizada<ContactoProveedor>(); }

                // Instanciando contacto
                ContactoProveedor contactoProveedor = new ContactoProveedor();
                contactoProveedor.nombresyApellidos = this.txtContactoNombresyApellidos.Text;
                contactoProveedor.email = this.txtContactoEmail.Text;
                contactoProveedor.telefono = this.txtContactoTelefono.Text;
                contactoProveedor.cargo = this.txtContactoCargo.Text;
                contactoProveedor.anexo = this.txtContactoAnexo.Text;

                if (validarContactoRepetido(this.txtContactoNombresyApellidos.Text))
                {
                    //Libreria.CampoNecesario(this.txtContactoNombresyApellidos, "Este contacto ya se encuentra asociado al proveedor", TITULO);
                    //return;

                    ListPersonalizada<ContactoProveedor> listaContactoProveedornueva = new ListPersonalizada<ContactoProveedor>();

                    if (listaContactoProveedor != null)
                    {
                        foreach (ContactoProveedor item in listaContactoProveedor)
                        {
                            if (item.nombresyApellidos.Equals(this.txtContactoNombresyApellidos.Text)) { }
                            else
                            {
                                listaContactoProveedornueva.Add(item);
                            }
                        }
                        listaContactoProveedor = listaContactoProveedornueva;
                    }

                }
                // Agregando contacto
                listaContactoProveedor.Add(contactoProveedor);
                
                // Actualizando en grilla
                this.dgvListadoContactos.DataSource = null;
                this.dgvListadoContactos.DataSource = listaContactoProveedor;

                // Limpiando campos del contacto
                limpiarContacto();

                // Estableciendo focus
                this.txtContactoNombresyApellidos.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarContacto()
        {
            try
            {
                // Obteniendo lista de contactos
                ListPersonalizada<ContactoProveedor> listaContactoProveedor = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;

                if (listaContactoProveedor != null && listaContactoProveedor.Count > 0)
                {
                    // Obteniedo contacto seleccionado
                    ContactoProveedor contactoProveedor = listaContactoProveedor[this.dgvListadoContactos.CurrentRow.Index];

                    // Eliminando contacto
                    listaContactoProveedor.Remove(contactoProveedor);

                    // Actualizando en grilla
                    this.dgvListadoContactos.DataSource = null;
                    this.dgvListadoContactos.DataSource = listaContactoProveedor;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarContactoRepetido(string nombresyApellidos)
        {
            bool resultado = false;

            // Obteniendo lista de contactos
            ListPersonalizada<ContactoProveedor> listaContactoProveedor = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;

            if (listaContactoProveedor != null)
            {
                foreach (ContactoProveedor item in listaContactoProveedor)
                {
                    if (item.nombresyApellidos.Equals(nombresyApellidos))
                    {
                        resultado = true;
                        break;
                    }
                }
            }

            return resultado;
        }

        private void seleccionarProveedor()
        {
            if (this.formularioBusqueda)
            {
                // Valida si seleccione algun proveedor
                if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
                {
                    ListPersonalizada<Proveedor> listaProveedor = (ListPersonalizada<Proveedor>)this.dgvListado.DataSource;
                    this.proveedorActual = listaProveedor[this.dgvListado.CurrentRow.Index];

                    this.DialogResult = DialogResult.OK;
                }
            }
        }

        private void seleccionarContactoProveedor()
        {
            // Valida si seleccione algun contactoproveedor
            if (this.dgvListadoContactos.CurrentRow != null && this.dgvListadoContactos.CurrentRow.Index > -1)
            {
                // Obteniendo lista de contactos
                ListPersonalizada<ContactoProveedor> listaContactoProveedor = (ListPersonalizada<ContactoProveedor>)this.dgvListadoContactos.DataSource;
                ContactoProveedor ContactoProveedorActual = new ContactoProveedor();
                ContactoProveedorActual = listaContactoProveedor[this.dgvListadoContactos.CurrentRow.Index];

                //Cargar datos
                this.txtContactoNombresyApellidos.Text = ContactoProveedorActual.nombresyApellidos;
                this.txtContactoCargo.Text = ContactoProveedorActual.cargo;
                this.txtContactoEmail.Text = ContactoProveedorActual.email;
                this.txtContactoTelefono.Text = ContactoProveedorActual.telefono;
                this.txtContactoAnexo.Text = ContactoProveedorActual.anexo;

            }

        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;

            this.ESTADO = Constantes.ESTADO_CODIGO_ACTIVO;
        }
        
        private void salir()
        {
            if (this.formularioBusqueda)
            {
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                this.Close();
            }
        }
        #endregion

  
    }
}
